package main

import (
	"fmt"
	"net"
)

/*
聊天室服务端代码：
: hello
*/
// connList连接列表
var connMap = make(map[string]net.Conn)

// handleConn 处理客户端连接请求
func handleConn(conn net.Conn, address string) {
	defer conn.Close()
	for {
		// 等待客户端发送信息
		var buf = make([]byte, 1024)
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println(err)
		}
		if n == 0 {
			fmt.Printf("客户端[%s]下线!\n", address)
			delete(connMap, address)
			return
		}
		// 重构消息
		var reMsg = "[" + address + "]:" + string(buf[:n])
		// 给每个客户端返回信息
		for _, singleConn := range connMap {
			singleConn.Write([]byte(reMsg))
		}
	}
}

func main() {
	// 获取服务端套接字对象
	sock, _ := net.Listen("tcp", "127.0.0.1:9090")
	for {
		fmt.Println("等待客户端连接中...")
		conn, err := sock.Accept()
		if err != nil {
			fmt.Println("等待客户端连接异常!", err)
		}
		// 获取客户端ip
		address := conn.RemoteAddr().String()
		fmt.Printf("客户端[%s]连接成功!\n", address)
		connMap[address] = conn
		// 启动处理单个客户端的线程
		go handleConn(conn, address)
	}
}
